git常用操作及配置
Centos7更新git版本
背景描述:
CentOS7上的Git版本太陈旧,在使用过程中会遇到问题,因此需要升级git版本。
# 查看git版本 # git --version git version 1.8.3.1 # 系统版本:(CentOS 7.6) # cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)Linux配置git命令自动补全
# 下载git-completion.sh wget -O /etc/profile.d/git-completion.sh https://raw.github.com/git/git/master/contrib/completion/git-completion.bash
Centos7使用SCL源安装git2–推荐
https://blog.csdn.net/omaidb/article/details/126462159
Centos7使用yum安装git236版本-IUS源
参考: https://blog.csdn.net/omaidb/article/details/126462236
github加速
在https://github.com前面加上https://ghproxy.com/,如下图:

# 使用hosts wget -c https://gitee.com/fliu2476/github-hosts/raw/main/hosts # 合并github的hosts到/etc/hosts echo hosts >> /etc/hostsWindows安装git命令行版
# 安装git客户端 choco install git -y使用cmder中的git纯命令行
# 安装cmder终端 choco install cmder -ycmder终端的Windows版git命令行路径:C:\tools\Cmder\vendor\git-for-windows\cmd\git.exe
在pwsh7的$Profile中配置git的Alias
# 配置git的Alias Set-Alias git "C:\tools\Cmder\vendor\git-for-windows\cmd\git.exe"
# 测试是否能正常执行git命令 git ---version
git常用配置
参考: https://segmentfault.com/a/1190000039320926
快速push参考:
https://zhuanlan.zhihu.com/p/133871333
https://www.jianshu.com/p/d32d322766eb
配置文件在~/.gitconfig
# Git LFS 的过滤器配置 ## Git LFS (Git Large File Storage) 是Git中用于管理大型二进制文件的扩展 [filter "lfs"] # "clean" 过滤器命令,用于在提交文件之前对文件进行清理操作 ## %f 是一个占位符,表示被过滤的文件路径。 ## git-lfs clean 是Git LFS提供的清理命令,用于将文件添加到Git仓库之前,将大型文件替换为指向Git LFS(远程存储)的指针。 clean = git-lfs clean -- %f # "smudge" 过滤器命令,用于在检出文件时对文件进行还原操作 ## %f 是一个占位符,表示被过滤的文件路径。 ## git-lfs smudge 是Git LFS提供的还原命令,从Git仓库中检出文件时,将指向Git LFS(远程存储)的指针转换为实际的大型二进制文件 smudge = git-lfs smudge -- %f # "process" 过滤器命令,用于在文件读写过程中进行处理操作。 ## git-lfs filter-process 是Git LFS提供的处理命令,用于自动执行 "clean" 和 "smudge" 操作 ## 每当Git需要处理大型二进制文件时Git LFS就会运行下面的命令 process = git-lfs filter-process # 必须使用Git LFS来管理大型二进制文件 required = true [user] name = 自然自在 email = xxx@gmail.com # GitHub访问太慢,给它加个proxy加速一下 ## 单独配置github.com # [http "https://github.com"] # proxy = socks5h://127.0.0.1:51837 # 给所有http链接加代理 [http] proxy = socks5h://127.0.0.1:1080 # 给所有https链接加代理 [https] proxy = socks5h://127.0.0.1:51837 # 带认证的proxy格式 # https://qiaofei:qiaofei123@proxy.ibm.com:443 # 配置快速push [alias] fp = "!git add .;git commit -m 快速push;git push" [push] # 在Git2.0以后,push.default由 'matching'修改为 'simple' # simple 只推送当前分支 # matching 推送所有有对应的远程分支的本地分支 default = simple # 配置git上传文件大小 # ttps://blog.csdn.net/yilulvxing/article/details/87859483 [http] # 单位Bytes = 500M postbuffer=524288000 # 安全目录 [safe] directory = D:/code/qiaofei_notes # 给Git 输出添加颜色 [color] ui = true [core] # 压缩级别 -1 到9 ## -1是默认参数,9最慢 compression = 9git上传超过100MB文件
git上传大文件
github仓库容量限制在1G,单个文件不能超过100M,有50M的文件,就会警告。
参考:https://blog.csdn.net/yilulvxing/article/details/87859483
上传项目到GitHub上,当某个文件大小超过100M时,就会上传失败,因为默认的限制了上传文件大小不能超过100M。如果需要上传超过100M的文件,就需要我们自己去修改配置。
首先,打开终端,进入项目所在的文件夹;
# git全局配置上传缓冲区大小到500M git config --global http.postBuffer 524288000 # 针对当前仓库配置上传缓冲区大小到500M git config http.postBuffer 524288000查看git配置
# 查看git配置 git config -l可以看到配置项的最下面多出了一行我们刚刚配置的内容. (52428000 Bytes =500×1024×1024,即500M)。
socks5访问不了github
如果用socks5也访问不了 github ,可以在 .gitconfig 中把 socks5:// 换成 socks5h:// ,这样会使用远端解析 DNS 保证域名不被污染;也可以换用 http proxy.
(其中 socks5h 表示远程解析 dns,如果直接写 socks5 是本地解析 dns )

clone的时候有时候会有很大的.git目录
只是为了clone尽量小的话,用git clone --depth=1只获取最新的commit即可
# 只获取最近一次的提交 git clone --depth=1 <远程仓库URL>Linux下为git配置token免密登录
参考: https://beginor.github.io/2014/03/04/git-client-save-user-pass.html
(多平台通用)在用户的home目录下创建一下_netrc文件或者.netrc文件:
LinuxormacOS下创建~/.netrc;Widnows下建议创建~/_netrc。
# 在用户的home目录下创建一下`.netrc`文件 touch ~/.netrc.netrc文件内容如下:
# 配置github推送代码免密 machine github.com login not-used password {token} machine api.github.com login not-used password {token}git常用操作
在git中有三个区域:
工作区–文件实际的位置暂存区–将要提交的文件列表版本库–存储项目的历史记录和元数据。- 版本库包括了
已经提交的文件快照、指向每个快照的指针。 每次提交都会创建一个新的版本,并将其添加到版本库中。版本库中的每个版本都包含一个指向其父版本的指针,这样就可以跟踪提交历史。
- 版本库包括了
在使用Git进行版本控制时,我们首先对文件进行修改,然后将修改的文件添加到暂存区,最后再将暂存区中的文件提交到版本库中。
通过这种方式,我们可以很好地控制代码的版本和变化过程,同时也可以比较容易地回滚到之前的某个版本。
配置git用户信息
# 设置全局用户签名 ## git config --global user.name 用户名 git config --global user.name "Your Name" # 配置全局Email ## git config --global user.email 邮箱 git config --global user.email "you@example.com"
# 查看该git用户信息 cat ~/.gitconfig
删除git配置项
# 针对当前仓库配置上传缓冲区大小到500M git config http.postBuffer 524288000 # 删除core.hooksPath的当前配置项 git config --unset core.hooksPath # git全局配置上传缓冲区大小到500M git config --global http.postBuffer 524288000 # 删除core.hooksPath的全局配置项 git config --global --unset core.hooksPath # 查看该git用户信息 cat ~/.gitconfig本地创建项目版本库
# 在本地创建项目 目录 mkdir -p git_projecat_dir_name # 进入本地项目 目录 cd git_projecat_dir_name # 将当前目录转换为Git版本库。 ## 初始化本地仓库 git init
git代码版本库就是目录下的.git目录
# 查看.git目录详情 ls .git/
添加文件到暂存区
# 创建代码文件1 echo "test" > test.py # 将文件添加到暂存区,准备提交到仓库。 # git add <file> git add test.py # 查看当前工作区和暂存区的状态。 git status
撤销修改
https://blog.csdn.net/kikajack/article/details/79846098
撤销文件在工作区的修改–未执行git add。
# 撤销指定文件在工作区的修改 git checkout -- test.py
撤销指定文件在暂存区的修改–未执行git add
# 将文件从暂存区中移除,但保留工作区的更改 git restore --staged <file> # 撤销指定文件在工作区的修改 git checkout -- 文件名撤销之前的所有git add 操作,即在暂存区的所有修改。
# 撤销暂存区的所有修改 git restore
提交代码更改到版本库
# 添加到暂存区并提交到版本库 ## -a add 添加到暂存区 git commit -a -m "<message>" # 查看当前工作区和暂存区的状态。 git status
# 将暂存区的内容提交到版本库,并添加提交信息。 ## -m 提交的消息 git commit -m "<message>"
# 查看当前分支的commit提交记录。 git log
回退撤销commit
# 把HEAD指针(即当前分支的指针)回退到前两个提交,但是保留工作区的更改。 # 软重置 git reset --soft HEAD~2 # 硬重置(Hard Reset): # 彻底删除这两次提交,并且不保留这些更改 git reset --hard HEAD~2分支管理
# 克隆远程仓库到本地。 git clone <repository-url> # 将指定分支合并到当前分支。 git merge <branch-name> # 将本地仓库的代码推送到远程仓库。 git push # 从远程仓库拉取最新的代码到本地仓库。 git pull ## 将远程仓库对应分支最新内容拉下来后与当前本地分支直接合并 git pull 远程库地址别名 远程分支名查看本地分支
# 查看本地分支 # 列出当前所有分支。 git branch # 打印结果 * main创建新的分支
# 创建一个新分支。 git branch <branch-name>切换到指定分支
# 切换到指定分支。 git checkout <branch-name>将指定分支合并到当前分支
# 将指定分支合并到当前分支。 git merge <branch-name>push代码
在提交之前执行 git diff 显示差异,以避免签入意外的代码。
# 将代码添加到暂存区 git add . # commit代码 git commit -m "本次提交备注" # 推送代码到远程仓库的master git push -u origin master # 完成后 # 推送至远程分支 ## git push origin 分支名 git push origin master ## 或 git push撤销add和commit
git pull时提示:error: cannot pull with rebase: You have unstaged changes. error: please commit or stash them.
翻译: 错误:无法使用 rebase 拉取:您有未暂存的更改。 错误:请提交或隐藏它们。
# 撤销commit和add操作,删除工作空间改动代码 ## ^表示父提交 ## HEAD^2 表示当前提交的第二个父提交 git reset --hard HEAD^git添加项目地址
https://docs.github.com/cn/get-started/getting-started-with-git/managing-remote-repositories
# git添加项目地址 git remote add origin https://github.com/user/repo.git # 起别名 git remote add 别名 远程地址 # 查看项目远程仓库 git remote -vgit修改项目地址
参考: https://www.jianshu.com/p/ebc6b1a026c2
# 进入项目目录 cd 项目路径 # 查看所有远程仓库 git remote # 查看当前所有远程地址别名 git remote -v # 查看指定远程仓库地址 git remote xxx # 修改项目地址 git remote set-url origin http://192.168.100.235:9797/john/git_test.git查看分支提交历史
# 查看分支提交历史 git log # 查看本地库状态 git status # 查看历史版本 git reflog # 版本穿梭 git reset --hard 版本号分支管理
参考: https://backlog.com/git-tutorial/cn/stepup/stepup2_3.html
如何在fork上创建基于主repo的master创建开发分支
# 创建一个名为“branch-name”的新分支,并将当前工作目录切换到该分支。 git checkout -b branch-name # 从“upstream”远程代码库中获取最新的代码,但并不将其合并到当前本地分支。 ## 它通常用于在本地创建一个与远程仓库同步的备份分支,以便轻松地比较和合并更改。 git fetch upstream # 将当前分支重置为与“upstream/master”分支相同的状态。 ## 这将会丢弃当前分支上所有未提交的更改,并将当前分支指向“upstream/master”分支所指向的提交。请注意,这是一种危险的操作,因为它将覆盖本地分支上的任何更改,应谨慎使用。 git reset --hard upstream/master # 将本地分支 branch-name 推送到远程仓库 origin,并创建一个名为 branch-name 的远程分支作为其跟踪分支,以便在以后的推送和拉取操作中使用。如果这个远程分支不存在,则会自动创建它。 ## 通过 --set-upstream 参数指定本地分支与远程分支之间的跟踪关系,使得在执行类似 git pull 和 git push 这样的命令时,Git 能够正确地识别要拉取或推送的分支。 ## 需要注意的是,在第一次 push 时使用该命令非常有用,但在之后的推送和拉取操作中,您可以简单地使用 git push 和 git pull 来更新远程分支。 git push --set-upstream origin branch-name查看远程有哪些分支
# 查看分支 git branch -v # 查看当前分支 git branch # 查看所有分支 git branch -a # 以“main”分支为基础,将当前所在分支(即“branch-name”分支)的提交移动到“main”分支之后,并使它们成为“main”分支的直接子提交。 git rebase main创建分支
# 创建 gh-pages 分支 # master 分支用作保存源码使用,而 gh-page 则是部署静态代码使用 # 提交后 Github 会默认 gh-pages 为静态网站分支,无须再开启,默认链接是 https://username.github.io/blog ## git branch 分支名 git branch gh-pages # 将本地分支 gh-pages 推送到远程仓库 origin 的同名分支,并通过 -u 参数设置该分支为跟踪分支。 git push -u origin gh-pages合并分支
# 将指定分支合并到当前分支 git merge <branch-name>切换分支
# 切换分支 git checkout 分支名 # 切换到master分支 git checkout master新建本地分支和远程分支关联
# 切换到v22.05分支 git checkout -t remotes/origin/v22.05 # 切换回master分支 git checkout master回滚代码
回滚场景:已 commit,但还没push 时
# 回退到上个版本 git reset --hard HEAD ## ^ 符号通常用于访问某个提交的父提交 ## HEAD^2 表示当前提交的第二个父提交 git reset --hard HEAD^ # 回滚到指定的commit_id ## git reset --hard <要回滚到的 commit> git reset --hard commit_id恢复修改
回滚场景:已 push 到远端时,此时不能用
git reset,需要用git revert!
# 恢复到97ea0f9的修改 git revert -n 97ea0f9 # 默认拉取vim填写日志,保持默认日志即可 git revert --continue ## 或 git commit -m "恢复第三次修改" # 记得处理完推送到远端 git push # 推送本地分支上的内容到远程仓库 git push 别名 分支git移除已经add的文件
原文链接:https://blog.csdn.net/Torey_Li/article/details/87442355
如果git要删除文件,最好用 git rm file_name,而不应该直接在工作区直接 rm file_name。
git rm 命令
使用 git rm 命令即可,有两种选择,
# 不删除物理文件,仅将该文件从缓存中删除 git rm --cached “文件路径” # 将该文件从缓存中删除,还会将物理文件删除(不会回收到垃圾桶) git rm --f “文件路径”请问 git rm --cache 和 git reset HEAD 的区别到底在哪里呢?
如果要删除文件,最好用 git rm file_name,而不应该直接在工作区直接 rm file_name。
如果一个文件已经add到暂存区,还没有 commit,此时如果不想要这个文件了;
有两种方法:
1,用版本库内容清空暂存区,但要慎重使用
git reset HEAD2,只把特定文件从暂存区删除,
git rm --cached xxx删除分支
# 删除本地分支 git branch -d localBranchName # 删除远程分支 git push origin --delete remoteBranchNamecommit后修改代码
git 小技巧,一次 commit以后,突然发现还有点问题,又修改了几行代码,不想生成一个新的 commit 怎么办?
# 先修改代码 # 添加修改: git add . # 使用原来的 commit: git commit --amend --no-editdiff对比文件差异
# 比较两个文件并将差异输出到另一个文件 ## -w 参数忽略空格和制表符的差异。 ## -b 参数忽略空白行的差异。 ## -a 参数将所有文件视为文本文件进行比较。 ## -y 参数以并排的方式显示比较结果。 diff -wbay file_A fiale_B > file.diffcomm只显示差别内容
# 表示file1与file2比较,显示只存在file1文件中的行 ## -23 只输出file1文件中独有的行 comm -23 <(sort file1.txt) <(sort file2.txt) # 将只存在file1文件中的行,添加到file2中 comm -23 <(sort file1.txt) <(sort file2.txt)| pv >> file2.txt
git技巧
简单省力的 workflow:
如果误操作 check-in 到了 master/main branch 怎么办?
直接 create-checkout branch,然后把 local master/main 删掉。
免去了 local reset,也省得 local/remote out of sync
首先,创建并检出一个新的分支,这样你刚刚提交的更改就会在这个新的分支上:
git checkout -b new-branch然后,你可以删除本地的 master 或 main 分支:
git branch -d master或者
git branch -d main这样做可以避免使用 git reset 命令并防止本地和远程的 master/main 分支不同步。
记住,永远不要直接在 master/main 分支上进行开发,这是一个很好的实践,可以帮助你保持代码库的整洁和管理性。